home *** CD-ROM | disk | FTP | other *** search
- #include "ComponentData.h"
- #include "MyOpenComponent.h"
-
- pascal ComponentResult MyOpenComponent(ComponentInstance self)
- {
- ComponentResult result = 0; // Must be 0 for RegisterComponent
- PrivateGlobals **storage;
- SharedGlobals *mySharedGlobalsPtr;
-
- if (storage = (PrivateGlobals **) NewHandleClear( sizeof(PrivateGlobals) ))
- {
- HLock(storage);
-
- /***********************************
- We need self for REGISTERCOMPONENT
- Set storage BEFORE calling ComponentSetTarget and
- RegisterComponent
- ***********************************/
- (*storage)->self = self;
- SetComponentInstanceStorage (self, (Handle) storage);
-
- /************************************
- If we have global storage, we have registered, and grabbed
- the base component. We now need to open the base component,
- and target it.If no global storage, we do nothing more
- and wait for the register call.
- ***********************************/
- mySharedGlobalsPtr = GetComponentGlobals(storage);
- if (mySharedGlobalsPtr) // Did we call REGISTERCOMPONENT?
- {
- /* Do these routines once for all instances. We check for a 0 delegateComponent,
- and then we fill it up */
- if (!mySharedGlobalsPtr->delegateComponent)
- {
- if ( QuickTimeAvailable() && SpeechAvailable() )
- {
- Component delegateComponent=0;
-
- delegateComponent = GetDelegateComponent();
- if (delegateComponent)
- mySharedGlobalsPtr->delegateComponent = CaptureComponent (delegateComponent, (Component)(*storage)->self);
- }
- else
- return -1; // Bail: No QuickTime and/or Speech Manager
- }
-
- (*storage)->delegate = OpenComponent (mySharedGlobalsPtr->delegateComponent);
- result = ComponentSetTarget ((*storage)->self, (*storage)->self);
-
- if ((*storage)->delegate)
- {
- OSErr err;
- /************************************
- If these routines fail, we don't care
- ***********************************/
- DoSetTTS(storage); // get voice characteristics
- GetInstanceSpeechChannel(storage,mySharedGlobalsPtr);
- (*storage)->textH = NewHandleClear(sizeof(Handle));
- (*storage)->translatedTextH = NewHandleClear(sizeof(Handle));
- }
- }
- }
-
- return (result);
- }
-
- Component GetDelegateComponent(void)
- {
- ComponentDescription delegateDesc;
- Component delegateComponent;
-
- delegateDesc.componentType = kCaptureComponentType;
- delegateDesc.componentSubType = kCaptureComponentSubType;
- delegateDesc.componentManufacturer = kCaptureComponentManufacturer;
- delegateDesc.componentFlags = kCaptureComponentFlags;
- delegateDesc.componentFlagsMask = kCaptureComponentFlagsMask;
-
- delegateComponent = FindNextComponent (nil, &delegateDesc);
-
- return delegateComponent;
- }
-
- Boolean QuickTimeAvailable(void)
- {
- OSErr err=noErr;
- long result;
-
- err = Gestalt(gestaltQuickTime,&result);
- if ( err )
- return false;
- else
- return true;
- }
-
- Boolean SpeechAvailable(void)
- {
- OSErr err=noErr;
- long result;
-
- err = Gestalt(gestaltSpeechAttr,&result);
- if ( err )
- return false;
- else
- return true;
- }
-
- ComponentResult DoSetTTS(PrivateGlobals **storage)
- {
- Component ttsComponent;
- ComponentInstance ttsCInstance;
- ComponentDescription ttsDesc;
- Point where = {0,0};
- OSErr err = componentDontRegister;
- ComponentResult result=-1;
-
- ttsDesc.componentType = stdTextToSpeechComponentType;
- ttsDesc.componentSubType = 0;
- ttsDesc.componentManufacturer = 'appl';
- ttsDesc.componentFlags = 0;
- ttsDesc.componentFlagsMask = 0;
-
- ttsComponent = FindNextComponent(nil, &ttsDesc);
-
- #define kDefaultVoice 1
- GetIndVoice(kDefaultVoice,&((*storage)->coolTTSParams.curVoice.voice));
-
- if (ttsComponent)
- {
- ttsCInstance = OpenComponent(ttsComponent);
- result = StdSpeechDialog(ttsCInstance, &(*storage)->coolTTSParams, &where);
- err = CloseComponent(ttsCInstance);
- }
-
- return result;
- }
-
-
- ComponentResult GetInstanceSpeechChannel(PrivateGlobals **storage,SharedGlobals *mySharedGlobalsPtr)
- {
- OSErr err=noErr;
-
- err = NewSpeechChannel(&(*storage)->coolTTSParams.curVoice.voice,&(*storage)->coolSpeechChannel);
- if (!err)
- {
- // We have a channel: these routines are icing, don't care if they fail
- SetSpeechInfo((*storage)->coolSpeechChannel, soRefCon, mySharedGlobalsPtr);
- SetSpeechInfo((*storage)->coolSpeechChannel, soRate, &(*storage)->coolTTSParams.rate);
- SetSpeechInfo((*storage)->coolSpeechChannel, soPitchMod, &(*storage)->coolTTSParams.modulation);
- SetSpeechInfo((*storage)->coolSpeechChannel, soPitchBase, &(*storage)->coolTTSParams.pitch);
- }
-
- return (ComponentResult) err;
- }
-
-
- Component GetMyOriginal(PrivateGlobals **storage)
- {
- ComponentDescription originalDesc;
- Component originalComponent;
- ComponentResult result;
- Component cloneComponent;
-
- originalDesc.componentType = kCaptureComponentType;
- originalDesc.componentSubType = kCaptureComponentSubType;
- originalDesc.componentManufacturer = kMyManufacturer;
- originalDesc.componentFlags = kCaptureComponentFlags;
- originalDesc.componentFlagsMask = kCaptureComponentFlagsMask;
-
- result = GetComponentInfo ((Component) (*storage)->self, &originalDesc, nil, nil, nil);
- cloneComponent = (Component)(originalDesc.componentFlagsMask);
-
- do
- {
- originalComponent = FindNextComponent (nil, &originalDesc);
- }
- while ( originalComponent == cloneComponent );
-
- return originalComponent;
- }
-
-
- SharedGlobals *GetComponentGlobals(PrivateGlobals **storage)
- {
- Component originalComponent;
- SharedGlobals *mySharedGlobalsPtr;
-
- mySharedGlobalsPtr = nil;
- if (GetComponentInstanceA5((*storage)->self)) // been cloned
- {
- originalComponent = GetMyOriginal(storage);
- mySharedGlobalsPtr = (SharedGlobals *) GetComponentRefcon( originalComponent );
- }
- else
- mySharedGlobalsPtr = (SharedGlobals *) GetComponentRefcon( (Component) (*storage)->self );
-
- return mySharedGlobalsPtr;
- }
-
-
-